package com.example.demo.service;

import com.example.demo.entity.Articleinfo;
import com.example.demo.entity.Commentinfo;
import com.example.demo.entity.vo.CommentinfoVO;
import com.example.demo.mapper.ArticleMapper;
import com.example.demo.mapper.CommentsMapper;
import com.example.demo.mapper.UserMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Description:
 */
@Service
public class CommentService {

    @Resource
    private CommentsMapper mapper;
    @Resource
    private UserMapper userMapper;
    @Resource
    private ArticleMapper articleMapper;

    // 根据文章id查询文章评论信息
    public List<CommentinfoVO> getCommentList(Integer content_id, Integer comment_level, Integer parent_id) {
        // 评论信息
        List<Commentinfo> list = mapper.getCommentList(content_id, comment_level, parent_id);
        // 创建评论视图列表
        List<CommentinfoVO> result = new ArrayList<>();
        for (Commentinfo commentinfo : list) {
            commentinfo.setComment_level(null);
            commentinfo.setStatus(null);
            // 填入评论视图列表
            // Spring 提供的深克隆方法
            CommentinfoVO commentinfoVO = new CommentinfoVO();
            BeanUtils.copyProperties(commentinfo,commentinfoVO);
            commentinfoVO.setUsername(userMapper.getUserById(commentinfo.getUser_id()).getUsername());
            if(commentinfo.getParent_user_id() != null && commentinfo.getParent_user_id() > 0) {
                commentinfoVO.setParent_username(userMapper.getUserById(commentinfo.getParent_user_id()).getUsername());
            }
            result.add(commentinfoVO);
        }
        return result;
    }

    // 根据评论 id 获取评论信息
    public Commentinfo getComment(Integer id) {
        return mapper.getComment(id);
    }

    // 获取评论总数
    public Integer getCommentCount(Integer comment_id) {return mapper.getCommentCount(comment_id);}

    // 添加一条首评论
    public Integer addComment(Commentinfo commentinfo) {
        // 根据文章id查询对应的作者id
        Articleinfo articleinfo = articleMapper.getDetail(commentinfo.getContent_id());
        Integer author_id = articleinfo.getUid();
        // 判断评论的人是否为作者，如果是作者，comment_flag = 1，否则 = 2
        commentinfo.setComment_flag(author_id.equals(commentinfo.getUser_id()) ? 1 : 2);
        commentinfo.setComment_level(0);
        return mapper.addComment(commentinfo);
    }

    // 添加一条子评论
    public Integer addCommentChild(Commentinfo commentinfo) {
        // 修改父评论的是否存在子评论状态
        mapper.updateChildStatus(1, commentinfo.getParent_id());
        // 根据父评论id获取被回复评论的用户id
        Commentinfo parentInfo = mapper.getComment(commentinfo.getParent_id());
        commentinfo.setParent_user_id(parentInfo.getUser_id());
        // 由于父评论点击展开时，需要将所有的子评论都展示出来，因此父评论id要设置为根评论id
        // 判断父评论id的parent_id是否为空，如果为空， parent_id仍为父评论id，否则改为父评论的父评论id
        if(parentInfo.getParent_id() != null &&  parentInfo.getParent_id() > 0) {
            commentinfo.setParent_id(parentInfo.getParent_id());
        }
        // 设置评论用户标识
        // 根据文章id查询对应的作者id
        Articleinfo articleinfo = articleMapper.getDetail(commentinfo.getContent_id());
        Integer author_id = articleinfo.getUid();
        // 判断评论的人是否为作者，如果是作者，comment_flag = 1，否则 = 2
        commentinfo.setComment_flag(author_id.equals(commentinfo.getUser_id()) ? 1 : 2);
        // 设置评论等级
        commentinfo.setComment_level(1);
        return mapper.addComment(commentinfo);
    }

    // 根据评论 id 与 用户 id 删除评论
    public Integer delComment(Integer id, Integer uid) {
        return mapper.delComment(id, uid);
    }
}
